﻿#ifndef NRFJPROG_CMD_MGR_H
#define NRFJPROG_CMD_MGR_H

#include <QtCore/QObject>

#include "CommonType.h"

enum ENCMD_Result {
    ENCMD_Result_Success,
    ENCMD_Result_Failed,
    ENCMD_Result_Page_Parameter_Error,                  // page 参数错误
    ENCMD_Result_SN_Read_Failed,                        // sn读取失败
    ENCMD_Result_Mem_Data_Empty,                        // memory data 是空数据
    ENCMD_Result_Analyze_Mem_Data_Failed,               // 解析memory data错误
    ENCMD_Result_SN_Len_Error,                          // sn长度错误
    ENCMD_Result_SN_Write_Section_Len_Error,            // sn某节写入长度错误
    ENCMD_Result_SN_Write_Section_Failed,               // sn某节写入失败
    ENCMD_Result_New_SN_Read_Failed,                    // 读取新写入的sn失败
    ENCMD_Result_New_SN_Read_Not_Match,                 // 读取新写入的sn与写入的值不匹配

    ENCMD_Result_Unknown					= 0xFF
};


// nrfjprog 命令行指令
class NrfjprogCMDMgr : public QObject
{
public:

    static NrfjprogCMDMgr* getInstance();

    int32_t SetSNConfig(zl::SNConfig config);

    // 擦除整个mcu
    int32_t NrfjprogEraseMcu();

    // 擦除SN
    int32_t NrfjprogEraseSNMemory();

    // 读取SN序列号
    int32_t NrfjprogReadSNNum(QString& sn);

    // 写入SN序列号
    int32_t NrfjprogWriteSNNum(QString& sn, const int32_t page = 0);

private:
    NrfjprogCMDMgr();
    NrfjprogCMDMgr(const NrfjprogCMDMgr &);
    NrfjprogCMDMgr& operator = (const NrfjprogCMDMgr &);


    // 从指定地址开始 读取n个字节 对齐方式为 字对齐：aligned = 32 半字对齐：aligned = 16 字节对齐：aligned = 8
    int32_t nrfjprogMemRead(QString& ret, const int32_t& mem_address, const int32_t& read_bytes, const int32_t& aligned = 32);

    // 输入从FLASH中page开始地址读取到的数据memData 解析出SN序列号
    int32_t analyzeMemSnInfo(QString& ret, const QString& memData);

    // 输入一个字节数据 解析sn序号内容
    QString getByteDataSn(QString& byteData);

    // 向指定地址 写入4个字符
    int32_t nrfjprogMemWrite(const QString& data, const int32_t& page);
private:
    static NrfjprogCMDMgr* m_instance;

    QString cmd_;                           // nrfjprog的命令行命令

    int32_t             sn_config_address;     // sn 配置的地址
    int32_t             sn_config_rule_len;    // sn 配置的规则长度
    int32_t             sn_config_mem_len;     // sn 配置的占用内存长度
};



#endif // NRFJPROG_CMD_MGR_H
